/* 头文件声明区 */
#include <REGX52.H>//单片机寄存器专用头文件
#include <Key.h>//按键底层驱动专用头文件
#include <Seg.h>//数码管底层驱动专用头文件
#include <Led.h>
#define uchar unsigned char
#define uint unsigned int

/* 变量声明区 */
unsigned char Key_Val,Key_Down,Key_Old;//按键专用变量
unsigned char Key_Slow_Down;//按键减速专用变量
unsigned char Seg_Buf[6] = {10,10,10,10,10,10};//数码管显示数据存放数组
unsigned char Seg_Pos;//数码管扫描专用变量
unsigned int Seg_Slow_Down;//数码管减速专用变量
uchar Led_Buf[8]={0,0,0,0,0,0,0,0};//Led显示数据存放数组
uchar Led_Pos;//Led扫描专用变量
uchar Seg_Point[8]={0,0,0,0,0,0,0,0};//标记小数点
uchar Seg_Disp_Mode=0;//0为电压采集界面，1为数据显示界面，2为参数设置界面，3为计数统计界面
uchar V_Cat[4]={11,11,11,11};//电压采集数组
uchar V_Cat_Index=0;//数组指针
bit Set_Flag;//闪烁标志位
float Voltage;
uint Timer500Ms=0;//500ms闪烁标志
float Voltage_Real=3.0;
float Voltage_Set=3.0;
uint count=0;
uint Sys_Tick=0;//Led时间标志
uchar Key_Error=0;
bit Voltage_Flag=0;

/* 键盘处理函数 */
void Key_Proc()
{
	uchar i=0;//用来for循环
	if(Key_Slow_Down) return;
	Key_Slow_Down = 1;//键盘减速程序

	Key_Val = Key_Read();//实时读取键码值
	Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
	Key_Old = Key_Val;//辅助扫描变量
	
	if(Key_Down>=1 && Key_Down<=10){
		if(Seg_Disp_Mode==0 && V_Cat_Index<4){
			Key_Error=0;
			V_Cat[V_Cat_Index]=Key_Down-1;
			V_Cat_Index++;		
		}
		else{
			Key_Error++;
		}	
	}
	
	switch(Key_Down){
		case 11:
			Key_Error=0;
			if(Seg_Disp_Mode==0){
				if(V_Cat_Index>=4){
					Voltage=(V_Cat[0]*1000+V_Cat[1]*100+V_Cat[2]*10+V_Cat[3]+5)/1000.0;
					if(Voltage>0.01){
						Seg_Disp_Mode=1;
					}
					else{
						V_Cat_Index=0;
						for(i=0;i<4;i++){
							V_Cat[i]=11;
						}							
					}
				}
				else{
						V_Cat_Index=0;
						for(i=0;i<4;i++){
							V_Cat[i]=11;
						}							
				}		
			}
			else{
				Seg_Disp_Mode=0;
				V_Cat_Index=0;
				for(i=0;i<4;i++){
					V_Cat[i]=11;
				}									
			}			
			break;
		case 12:
			if(Seg_Disp_Mode==0)Key_Error++;
			if(Seg_Disp_Mode!=0){
				Key_Error=0;
				if(Seg_Disp_Mode==2)Voltage_Real=Voltage_Set;
				Seg_Disp_Mode++;
				if(Seg_Disp_Mode==4){
					Seg_Disp_Mode=1;
				}
			}

			break;
		case 14:
			if(Seg_Disp_Mode==0){
				Key_Error=0;
				V_Cat_Index=0;
				for(i=0;i<4;i++){
					V_Cat[i]=11;
				}				
			}
			if(Seg_Disp_Mode==3){
				Key_Error=0;
				count=0;
			}
			else{
				Key_Error++;
			}
			break;
		case 15:
			if(Seg_Disp_Mode==2){
				Key_Error=0;
				Voltage_Set+=0.5;
				if(Voltage_Set>6){
					Voltage_Set=1;
				}
			}
			else{
				Key_Error++;
			}
			break;
		case 16:
			if(Seg_Disp_Mode==2){
				Key_Error=0;
				Voltage_Set-=0.5;
				if(Voltage_Set<1){
					Voltage_Set=6;
				}
			}
			else{
				Key_Error++;
			}
			break;			
	}
}

/* 信息处理函数 */
void Seg_Proc()
{
	uchar i=0;//用来for循环
	uchar j=1;//用来while循环
	if(Seg_Slow_Down) return;
	Seg_Slow_Down = 1;//数码管减速程序
	
	if(Voltage>Voltage_Real)Voltage_Flag=1;
	else if(Voltage_Flag==1){
		Voltage_Flag=0;
		count++;
	}
	
	switch(Seg_Disp_Mode){
		case 0:
			Seg_Point[3+(int)Voltage/10]=0;
			Seg_Buf[0]=Seg_Buf[1]=10;
		  for(i=0;i<4;i++){
				Seg_Buf[2+i]=V_Cat[i];
			}
			if(V_Cat[3]==11){
				Seg_Buf[2+V_Cat_Index]=Set_Flag?V_Cat[V_Cat_Index]:10;
			}
		  break;
		case 1:
			Seg_Point[3+(int)Voltage/10]=1;
			Seg_Buf[0]=12;
			Seg_Buf[1]=Seg_Buf[2]=10;
		  Seg_Buf[3]=(uchar)Voltage/10?1:(uchar)Voltage%10;
			Seg_Buf[4]=(uint)(Voltage*10)%10;
			Seg_Buf[5]=(uint)(Voltage*100)%10;
			break;
		case 2:
			Seg_Point[3+(int)Voltage/10]=0;
			Seg_Point[3]=1;
			Seg_Buf[0]=13;
			Seg_Buf[1]=Seg_Buf[2]=10;
		  Seg_Buf[3]=(uchar)(Voltage_Set)%10;
			Seg_Buf[4]=(uint)(Voltage_Set*10)%10;
			Seg_Buf[5]=(uint)(Voltage_Set*100)%10;			
			break;
		case 3:
			Seg_Point[3+(int)Voltage/10]=0;
			Seg_Point[3]=0;
			Seg_Buf[0]=14;
			Seg_Buf[1]=count/10000%10;
			Seg_Buf[2]=count/1000%10;
			Seg_Buf[3]=count/100%10;
			Seg_Buf[4]=count/10%10;
			Seg_Buf[5]=count%10;
			while(Seg_Buf[j]==0){
				Seg_Buf[j]=10;
				if(++j==5)break;
			}
			break;
	}

}

/* 其他显示函数 */
void Led_Proc()
{
	if(Voltage<Voltage_Real){
		if(Sys_Tick==5000){
			Sys_Tick=0;
			Led_Buf[0]=1;
		}
	}
	else{
		Led_Buf[0]=0;
	}
	Led_Buf[1]=count%2;
	Led_Buf[2]=Key_Error/3;
}

/* 定时器0中断初始化函数 */
void Timer0Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;        //定时器0中断打开
	EA = 1;         //总中断打开
}

/* 定时器0中断服务函数 */
void Timer0Server() interrupt 1
{
 	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值   
	if(++Key_Slow_Down == 10) Key_Slow_Down = 0;//键盘减速专用
	if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;//数码管减速专用
	if(++Seg_Pos == 6) Seg_Pos = 0;//数码管显示专用
	if(++Led_Pos==8) Led_Pos=0;//Led显示专用
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
	Led_Disp(Led_Pos,Led_Buf[Led_Pos]);
	if(Voltage<Voltage_Real){
		Sys_Tick++;
	}
	
	if(Seg_Disp_Mode==0){
		Timer500Ms++;
		if(Timer500Ms==500){
			Timer500Ms=0;
			Set_Flag^=1;
		}
	}
		
}

/* Main */
void main()
{
	Timer0Init();
	while (1)
	{
		Key_Proc();
		Seg_Proc();
		Led_Proc();
	}
}